package com.wel.book.Utils;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;

import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * html页面解析工具
 * @author wel.xiao
 * 2013-4-7
 */
public class HtmlParseUtils {

	// 解析网页超时时间
	private static int timeout = 100000; 
	/**
	 * 测试
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Document doc = Jsoup.parse(new URL("http://www.baikv.com/xiaoshuo/2.html"), timeout);
		Element element = doc.getElementById("centerl");
		/*String[] bookPath = getBookInfo(element);
		System.out.println("书分类名："+bookPath[1]);
		System.out.println("书名："+bookPath[2]);*/
		getBookInfo(element);
	}
	
	/**
	 * 获取书本信息
	 * @param element
	 * @return
	 */
	public static void getBookInfo(Element element) {
		// 获取小说图片路径
		String bookNetworkImgPath = element.getElementsByTag("img").attr("src");
		System.out.println(bookNetworkImgPath);
		String extensionName = FileUtils.getExtensionName(bookNetworkImgPath);
		String localImgPath = getLocalImgPath(extensionName);
		System.out.println(localImgPath);
		// 把网络图片写入本地
		FileUtils.writeImageToLocal(bookNetworkImgPath, localImgPath);
		// 获取class=movieDetail的节点
		Elements elements = element.getElementsByClass("movieDetail");
		// 获取第一个节点的center节点--- 小说资料
		Elements bookNameElement = elements.first().getElementsByTag("center");
		// 获取节点下所有文本--- 小说名
		String bookName = bookNameElement.text();
		System.out.println(bookName);
		// 获取小说资料下所有的P标签
		Elements bookInfoElement = elements.first().getElementsByTag("p");
		for (int i = 1; i < bookInfoElement.size(); i++) {
			// 获取所有span标签下文本
			String info = bookInfoElement.get(i).getElementsByTag("span").text();
			if(StringUtils.isNotBlank(info)) {
				System.out.println(info);
			}
		}
		// TODO 把以上信息存入数据库 获取数据库ID
		
		// TODO 以书本ID为目录 存放小说内容
		int i = 1;
		// 取得第一个A标签的连接地址
		String articleListLink = bookInfoElement.last().getElementsByTag("a").first().attr("href");
		System.out.println(articleListLink);
		getArticleInfo(articleListLink,i+++"");
	}
	
	/**
	 * 获取文章信息
	 * @param articleListLink
	 * @return
	 */
	public static String[] getArticleInfo(String articleListLink, String bookDir) {
		Document doc;
		int articleName = 1;
		try {
			int n = articleListLink.lastIndexOf("/");
			// 小说目录
			String bookPath = articleListLink.substring(0,n+1);
			doc = Jsoup.parse(new URL(articleListLink), timeout);
			Elements element = doc.getElementsByTag("table").first().getElementsByTag("td");
			for (Element el : element) {
				try{
					Elements aTag = el.getElementsByTag("a");
					String articleTitle = aTag.text();
					System.out.println(articleTitle);
					String articleLink = aTag.attr("href");
//					try{
						doc = Jsoup.parse(new URL(bookPath+articleLink), timeout);
//					} catch (Exception e) {
//						e.printStackTrace();
//						// 如果打开小说时出现异常 让他重新连接一次
//						doc = Jsoup.parse(new URL(bookPath+articleLink), timeout);
//					}
					Element contentElement = doc.getElementById("content");
					String articleContent = contentElement.text();
					// 写文件
					String articlePath = getLocalArticlePath(bookDir, articleName+++"");
					FileUtils.writeFile(articlePath, articleContent, "UTF-8");
				} catch (Exception e) {
					e.printStackTrace();
					// 如果下载小说时出现异常 不终止程序 让他继续往下下载
					continue;
				}
			}
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void downLoad(String url) {
		for(int i = 1; i<=1000; i++){
			String title = FileUtils.readFile(url+i+"_title.txt");
			String content = FileUtils.readFile(url+i+"_content.txt");
			String article = title + content;
		}
	}
	
	public static String getLocalImgPath(String extensionName) {
		StringBuffer sb = new StringBuffer();
		// TODO 获取当前项目路径 web项目路径要另行处理
		String projectPath = System.getProperty("user.dir");
		sb.append(projectPath);
		// 为了防止linux与windows的分隔符不同
		sb.append(File.separator);
		sb.append("img");
		sb.append(File.separator);
		// 文件名以UUID命名
		sb.append(UUID.randomUUID());
		sb.append(".");
		sb.append(extensionName);
		return sb.toString();
	}
	
	public static String getLocalArticlePath(String bookDir, String articleName) {
		StringBuffer sb = new StringBuffer();
		// TODO 获取当前项目路径 web项目路径要另行处理
		String projectPath = System.getProperty("user.dir");
		sb.append(projectPath);
		// 为了防止linux与windows的分隔符不同
		sb.append(File.separator);
		sb.append("file");
		sb.append(File.separator);
		// 文件名以UUID命名
		sb.append(bookDir);
		sb.append(File.separator);
		sb.append(articleName);
		sb.append(".txt");
		return sb.toString();
	}
	
}
